{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Double Deep Q Networks"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import gym\n",
    "import numpy as np\n",
    "import torch\n",
    "import torch.optim as optim\n",
    "\n",
    "from IPython.display import clear_output\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "from timeit import default_timer as timer\n",
    "from datetime import timedelta\n",
    "import math\n",
    "\n",
    "from utils.wrappers import *\n",
    "from networks.networks import DQN\n",
    "from agents.DQN import Model as DQN_Agent\n",
    "from networks.network_bodies import AtariBody\n",
    "from utils.ReplayMemory import ExperienceReplayMemory\n",
    "\n",
    "from utils.hyperparameters import Config"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Hyperparameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "config = Config()\n",
    "\n",
    "config.device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "\n",
    "#epsilon variables\n",
    "config.epsilon_start = 1.0\n",
    "config.epsilon_final = 0.01\n",
    "config.epsilon_decay = 30000\n",
    "config.epsilon_by_frame = lambda frame_idx: config.epsilon_final + (config.epsilon_start - config.epsilon_final) * math.exp(-1. * frame_idx / config.epsilon_decay)\n",
    "\n",
    "#misc agent variables\n",
    "config.GAMMA=0.99\n",
    "config.LR=1e-4\n",
    "\n",
    "#memory\n",
    "config.TARGET_NET_UPDATE_FREQ = 1000\n",
    "config.EXP_REPLAY_SIZE = 100000\n",
    "config.BATCH_SIZE = 32\n",
    "\n",
    "#Learning control variables\n",
    "config.LEARN_START = 10000\n",
    "config.MAX_FRAMES=1000000\n",
    "\n",
    "#Nstep controls\n",
    "config.N_STEPS=1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Agent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Model(DQN_Agent):\n",
    "    def __init__(self, static_policy=False, env=None, config=None):\n",
    "        super(Model, self).__init__(static_policy, env, config)\n",
    "    \n",
    "    def declare_networks(self):\n",
    "        self.model = DQN(self.num_feats, self.num_actions, body=AtariBody)\n",
    "        self.target_model = DQN(self.num_feats, self.num_actions, body=AtariBody)\n",
    "\n",
    "    def get_max_next_state_action(self, next_states):\n",
    "        return self.model(next_states).max(dim=1)[1].view(-1, 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot(frame_idx, rewards, losses, sigma, elapsed_time):\n",
    "    clear_output(True)\n",
    "    plt.figure(figsize=(20,5))\n",
    "    plt.subplot(131)\n",
    "    plt.title('frame %s. reward: %s. time: %s' % (frame_idx, np.mean(rewards[-10:]), elapsed_time))\n",
    "    plt.plot(rewards)\n",
    "    if losses:\n",
    "        plt.subplot(132)\n",
    "        plt.title('loss')\n",
    "        plt.plot(losses)\n",
    "    if sigma:\n",
    "        plt.subplot(133)\n",
    "        plt.title('noisy param magnitude')\n",
    "        plt.plot(sigma)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Training Loop"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwYAAAE/CAYAAAD8LNSYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3XmcHGWdP/DPt6p7pmcyV26SkBBuBJTDCMghCCgg8EPd/bHghSy+UJFVV3+r4LG4HsjqqqyiKCriKueygKwHEJBDDsEk3FcSIOQgx+SaIzN91vP7o+qpfqq6qrp7Mkdn+vN+vcJMV1dXVfcMyfOt7/f7PKKUAhERERERNTdroi+AiIiIiIgmHgMDIiIiIiJiYEBERERERAwMiIiIiIgIDAyIiIiIiAgMDIiIiIiICAwMICL7i8hTIjIgIp+e6OuhxiUiq0Tk5Im+jp0lIn8SkfMm+jqIiBrVZPn7nqheTR8YAPgCgPuVUp1KqR9O9MWEicg1IvKyiDgi8tGI5/9ZRDaISL+IXCsircZzC0XkfhEZEpGXwn/JTdRrm4GIvNP7DPpEZFXE86tEZFhEBr0/9yQc62wRedT7PB+o8zq+JiK/NbcppU5TSv26nuOMBhGZIyJ3isgbIqJEZGHo+Zrfp4jsJyK/E5FeEdkqIneLyP4x+97nnS+VcLzY31kRaRWRH3jXvU1EfiIi6brePBER0S6AgQGwB4Dn454UEXscryXK0wAuArAs/ISInALgEgAnwX0fewH4N2OXGwE8CWA6gC8DuFVEZk7ka+uRNJAbS6N03h0ArgXwLwn7nKmU6vD+vDthv60ArgRwxShc10RyANwF4O9inq/nffYAuBPA/gBmA3gCwO/CO4nIBwHUMohP+p29BMAiAAcD2A/A4QC+UsMxiYiIdi1Kqab9A+DPAEoAsgAG4f6jfx2AqwH8Ee7g7mQAp8MdNPQDWAPga8YxFgJQAM73ntsG4BMA3gbgGQDbAVwVOu8/AnjR2/duAHvUcK0PA/hoaNsNAC43Hp8EYIP3/X4AcgA6jef/AuATE/naGt7nKgBf9D67HIAUgLkA/gdAL4DXAHza2zcDYBjADO/xlwEUAXR5j78B4Erv+1p+hhcAWA3gIW/7hwG8DmCLd+xVAE6u83fsZACrYt5nvcf6GIAH6tj/VAB5AAW4v99Pe9sfAPAx7/uPAngEwA+839VXARztbV8DYBOA84xjtgL4D+9z2gjgpwDa6nwfKe/zXjga79N7zTTvmNONbd0AlgM4ynsuFfPaar/vSwD8X+O5DwBYU8/18Q//8M+u9Uf/He39nXclgDe8P1cCaPX2mQHg997fnVu9vzcs77kvAlgHYADAywBOmuj3xD/8U8ufps4YKKVOhPs/8sXKvWu73HvqAwC+BaAT7oB8B4CPwL1LeTqAT4rIe0OHOxLAvgD+Ae5fHF+G+5fKQQDOFpHjAUBEzgLwJQDvBzDTO/+NI3wLB8HNKGhPA5gtItO9515VSg2Enj9ogl9bi3Phfs49cO8y/693jHlwg5DPisgpSqksgL8BON573fFwB/LHGI8f9L6v5Wd4PIA3AThFRA6EGyB+GG5gMh3A7npHETlWRLbX8Z6iXO+VwtwjIofs5LEqKKXuAnA5gJu93++4cxwJNxCbDjfouwluYLsPgA8BuEpEOrx9r4A7kD7Ue34egH/VBxKR7SJy7Gi/F+/Yz4jIB2Kefgfc4HSLse1yuD/DDRHH+r2IXOI9rOV3VkLf7y4i3fW+ByLa5XwZ7s2FQwEcAuAIlDOGnwewFu6/5bPh/tuuvLLGiwG8TSnVCeAUuIEGUcNr6sAgwe+UUo8opRylVFYp9YBS6lnv8TNwB/LHh17zDW/fe+AOQm9USm1SSq2DO/g/zNvvEwC+rZR6USlVhDt4OVRE9hjBdXYA6DMe6+87I57Tz3dO8Gtr8UOl1Bql1DDcAepMpdTXlVJ5pdSrAH4O4Bxv3wcBHO+V/7wFwA+9xxnvtQ8BQI0/w68ppXZ45/17AL9XSj2klMoB+CrcIAXe8R5WSvXU8Z7CPgg3U7EHgPsB3C0iO3O8nfGaUupXSqkSgJsBzAfwdaVUzvt9zgPYR0QEwIUA/lkptdUbSF+O8s8CSqkepdTDY3GRSqm3KKVuCG8Xkd0B/BjA54xti+AGiD+KOdYZSildslTtd/YuAJ8RkZkishsAPUlB+0jfCxHtMj4I9+/DTUqpXrhlsx/2nisAmAM3619QSv1FKaXgViK0AjhQRNJKqVVKqVcm5OqJ6sTAINoa84GIHOk1JvaKSB/cwf2M0Gs2Gt8PRzzWd1z3APCf3p1VnX4UuHde6zUIoMt4rL8fiHhOP6/vik7Ua2thfv57AJirPy/vM/sS3LszgBsYnAC37vtZAIvhDviPArBS30Gu8Wdonneu+VgptQNuSdGo8ALPYaXUkFLq23BT0ceN1vHrFP5dhVIq6vd3JtzB8FLjZ3GXt31CeH0A9wD4iVLqRm+bBeAnAD7jBd/VVPud/RbcMrSnADwK4A64A4KNIKLJbi7cTLT2urcNAL4LYCWAe0TkVZ2FVEqtBPBZAF8DsElEbhKRuSDaBTAwiKZCj2+A2+g4XynVDbeuWipeVZs1AD7u3VnVf9qUUo+O4FjPw01taocA2OgNhp8HsJeIdIaef36CX1sL8/NfA/eOtvl5dSql3uM9/yjcBtT3AXhQKfUCgAUA3oNyGRFQ28/QPO96uHfOAQAi0g631GasqIjrGa3jjpbNcIOEg4yfRbdSqqPaC8eCiEyFGxTcqZT6lvFUF9xm4ZtFZAPccjMAWCsiUcFX4u+sF8BdrJSap5TaC26AuFQp5UQci4gmlzfg3qDSFnjboJQaUEp93vt74f8A+JyInOQ9d4NS6ljvtQrAv4/vZRONDAOD2nQC2KqUyorIEXB7EEbqpwAuFZGDAEBEukXk/8btLCItXlmMAEiLSMa7IwoA/wXgAhE50CtD+Qrc5ml4/RJPAbjMe8374Jba/M8Ev7ZeTwAYEJEvikibiNgicrCIvM073xCApQA+hXIg8CjcjIAZGNT7M7wVwBleL0ELgK+jjv9fRMTyfm5p96FkvONARBaIyDH6Zysi/wI3e/FIzLFs71gpAJb3mlqny9wIYKHxOzNi3kD45wB+ICKzvGub581SVRPvfeipbVu9x/q5mt+niHTBbdx/RCl1SejpPrh39A71/ugg8q0AHo94X4m/s957nCuuo+CWlV1W63smol3ajQC+4pUSzoDbU/VbABCRM0REl1n2wS0hcsRdH+lEcafxzsK9ocIbCbRLYGBQm4sAfF1EBuD+pXDLSA+klLod7p2Dm0SkH8BzAE5LeMk9cP9SORrANd737/COdReA78CtUV8NN8VpDljOgXvndBvcptG/92okJ+y1IvJBEak5e+DVvZ8Bd4D3Gty71r+AO+OM9iDcAfgTxuNOeP0Fnrp+hkqp5+EGGzfAzR5sg9tkBu99HCcigwmHeAfcn9Uf4d5hGob7s4R3bVd7x1wHd/ag04yyp/Bn9GHv9VfDLTcahjtA19cyGHMnHAD+2/u6RUQqprwdgS/CTZ3/1fv9vRduxqaWawHca9ef20veY63a+3xe3OlHATdD9DYA50t5LYhBEVmgXBv0H7izWQFuVivvHetPIvIl49yxv7MA9oYbbO4A8GsAl3i9F0Q0+X0T7sxkz8AtV13mbQPcCUfuhft32mNwSxrvh3vz4wq4/15tADALwKXje9lEIyNunwwRERERETUzZgyIiIiIiIiBARERERERMTAgIiIiIiIwMCAiIiIiIjAwICIiIiIiuPOFN4wZM2aohQsXTvRlEBE1nKVLl25WSk3YKtONgv9OEBFFG41/JxoqMFi4cCGWLFky0ZdBRNRwROT1ib6GRsB/J4iIoo3GvxMsJSIiIiIiIgYGRERERETEwICIiIiIiMDAgIiIiIiIwMCAiIiIiIjAwICIiMaYiFwrIptE5Dlj23dF5CUReUZEbheRnom8RiIiYmBARERj7zoAp4a2LQZwsFLqLQCWA7h0vC+KiIiCGBgQEdGYUko9BGBraNs9Sqmi9/CvAHYf9wsjIqIABgZERDTR/hHAnyb6IoiImh0DA6Jd1MpNg1izdWjczvfyhgFs7M+O2/kawfNv9KF3IDfRlzGpiciXARQBXJ+wz4UiskRElvT29o7oPP3ZApat3jbCqyQiag4MDIh2USd//0Ec9537x+18p1z5EI68/L5xO18jOP2HD+PUKx+a6MuYtETkowDOAPBBpZSK208pdY1SapFSatHMmTNHdK6PXbcE7//Jo8gVSyO7WCKiJpCa6AsgImpkW3bkJ/oSJiURORXAFwAcr5Qa89TX02u3AwDiww8iItrpjIGIzBeR+0XkBRF5XkQ+422fJiKLRWSF93Xqzl8uERHtakTkRgCPAdhfRNaKyAUArgLQCWCxiDwlIj+d0IskIqJRyRgUAXxeKbVMRDoBLBWRxQA+CuA+pdQVInIJgEsAfHEUzkdEhh25Iqa0Mvk32hyHt5ZHi1Lq3IjNvxz3CyEiokQ7nTFQSq1XSi3zvh8A8CKAeQDOAvBrb7dfA3jvzp6LiFxmnfSGJmsIHi/5kjPRl0BERDSuRrX5WEQWAjgMwOMAZiul1ntPbQAwezTPRTQe1m0fxn0vbqzYvmTVVry4vj/xtQ+8vAmvb9nhP75t2VoMZAtVz5ktlHDLkjVQSmHp61vx3Lo+PLJyM17pHfT3ufHx1f73ty5di1eN56IM5oq4bdla3PHkOvTHXMOm/izuem69fw03/201HEfhydXb8Ozavthjv7F9GItfqPyMHl6xGVf9eQX+Z+lafO+el/3PcWN/FlfeuxzPeDXfKzYO4NFXNmPJqq344X0rsGUwh5v/thrbh/L48f0r8YPFy7G+bzjy3H3DBdzx5LrAtntf2Ii122ovWf/Lil68tnlHxXYzMNg+lMeP7luBJ17bWrEfERHRZDFq9Qci0gHgfwB8VinVLyL+c0opJSKReXkRuRDAhQCwYMGC0bocolFx/V9fx7WPvIaXvnFaYPvf//QxAMCqK06Pfe1Hf/U32Jbglcvfg2fX9uFztzyNMw+Zix+de1jiOa/680pcdf9KdLSmcNH1ywLPrbridGzsz+Jr//uCv+3qB17B1Q+8kngtX73jOdzuDaBPOmAWfvnRt1Xsc/Pf1uD79y7Hi18/FT998BVcee8KZNI2PnPTU4nX++FfPo5Xendg+TdPQ0uqfK/hszc/ic2D5cbdud0ZnPSm2bht2Tpcee8KLH19G35zwZF41w/cWX/2njkFr/TuwMMrNuOJVVvx30vWYsnr7vSSLSkLn3rnPhXn/tT1y/Dwys146x5TMX9aO5RS+Nh/LUFnJoVnv3ZK4nWXr/8JAJU/y3yxHBgsfmEjvrd4OfaZ1YF7P3d8TcelxpIrMgNERFTNqGQMRCQNNyi4Xil1m7d5o4jM8Z6fA2BT1GtHYxo6orEylC8FBoj1Knl16oM5d4HXWtYByBbcMqHXt0Tf9R7K1z/donnHfdWWyrvjADCYL0Ip91qHvXOs3RZ9p96kB//h97Y1NJvPQNb9DHTGYlN/cH2ANVvdc720wc3EmO9zKF9ElGfXuZkMfR9CD/70uXaG+XPXP5PBUTguERFRoxqNWYkEbhPZi0qp7xtP3QngPO/78wD8bmfPRTTe8iUHjgISpliPVAo1rjre6y2J2jtoRmcrAGDd9ujAYEeu/sGpoHzibCE60Ml523fkiuhpbwHgltBUM9O7XjMwGMgWYH4E83ravMBD+dcf7o3QpTv93uB72pSWqtfcN+wGGcVSMAAbDWZgoAOOEue6JCKiSWw0MgbHAPgwgBO9KeeeEpH3ALgCwLtEZAWAk73HRLsUPTisd4IafYdZ04GBXUNk0JlxK/yefyO6h2Ekd8ONyr6KawtvH8gWkUm7fzVsH6reEzGjwx3Ar+8rD/TD2YN9Z3dAKTcLoO+69w0X/MxElLRtBjPJWZKCF1SM5h39gtFjoIOWegNEIiKiXclO9xgopR4GEDfaOWlnj080kXRgUHJUTYN6rTIwcL9aUv0YOtvw/LrowGAkd8XrCQwGc0X/Dv22GgKD6R2VGQMzSACAfWZ24IGXezGYK2LAuP6kGZXM5t/hqoFBZcagWHKQskd+78OsSTd/D4iIiCarUZ2ViGiy0XeNnSp3iq975DW80juInzywEpv6s8iG+hL060UEz63r82cd+sVfXsXqLUN4tXcQ//XYKgDlQWjUdJm3LVuLwVz1wbo2lC/i+4uXo1AsX3/42rRho45ef39vxIxMYe1pGwBw+R9f9AfmFYHBrA4AwLf+8GJgZqa42YaAcmmTbYn//e+feQNLVm3F1h15fOn2Z/199c/JzKZc+8hrAIDlGwf8zzYsKQOgP3/bkvLPxPv6/Bt9+NmDr+BLtz+LW5eujT32NQ+9gtUxvSJERESNhqsiESWo5U5xrlgKzBL04Mu9+Nb73hzYRy+WZQtw3aOrsPiFjThh/5n45h9exK1L12LTQA5bd+TxgSMWoJhwrs/d8jS+cdZBAIBZna3YNJCL3RcAfnz/Svz4/lcC2+Lei84SDOaKyFW5Qx91PEcBS1/fhuP3m4l+r/b/O3/3Ftz74kbM6nKzCnc+/QYAYLeuDDb0Z9GXkJHIems1tLfYfjbj4hueBAD84B8OwQ3GlK1Fp3zt2g2Pr8aF79gb7//JoxjMFXH2ovnIeEFM+Nqj6J+9bYkfeOig6vQfPuzvd+MTq/H3b9294vW9Azlc/seXcOvStbjnnzmTERERNT5mDIgS6LvGSU2n4br2LTvyFeU6utTFEsGGvixyxZI/K0+u6Ph30fMlB4UqsyDpYOCuz74jsD1qpd56ZjAKlhKV0N2WRg2VT4FARjcW621nHjIX13xkETpa04HX9LS7j83P1ewpAMoZgyktKT9I0HRG4pfnLQIA5L2MiD7/yW+ahQ39WSil/GAhPAtS+NrDdGCQMjIGJUcFeg8AQKnoAGOjd77eKsEbERFRo2BgQJRA15lHDbq1cM1/vugEViYGygGGZQnW9w0jX3SwwRvcdrSm/P6FQlGhUKWOfeWmQdiW+E3K2lAdd/mj6Lvhuscgk7aQSdlVXuXerW/z7sTrIEkPlPX7mtIaPI4fGBjvdVZnBimjj0N/9u2tdkWT8sa+LDozKXS3pf1rAOD3L+w9qwPZguPPWgREly3VEhjYlgTKurKFElpCvQtbBisH/0llUkRERI2IgQFRglpKicKzBOWLTsX0mvo4lrh3kh3lrqoMuIPmlOX+r5grlSruSIet3DSIjtZUYBANRM/II7HzAlTKhXoMMmm74hxRCiWFqd5AXw/M9fSh+vWdoYyBP6AvlT/XOd2ZQIN3LlBKFPxM1vdlMac74zcXh2cl2mem29NgNjdHNToXEz5rHQykLAk0Ig8XSuhuD76fqGPrZmypJe1CRETUABgYECXI1zB/fUXGoORUlBLp4wzlS/7+q7e6TamZtO2vb5AvOomDVQBY4QUG4QFnPU3JUcKlRG1pu6ZSopKj0O2te6BLeUqOAxE3QwIAHaHsRk+bu79ZIrRbdzBjoIOB9ohSog39WczuyvjlR+VZiQqwLcGeM6YAANYZC7Rt6IsIDGrKGFjBNQ0KDnragoFBuNna3FatNIyIiKhRMDCgpuQ4Cl+783l/lV1tQ18WX7z1GX+QrO8aOw7w73e9hMt+9xxufKLc9Pr9xcsrFhwrhDIGl972rD+Djjmlp17ZeDhf8u98n3ftE/j5X16rev3hMiIA+Modz+HJ1duqvhYAPnfzU37t++otQ/jS7c9iMOe+57uf34B7XtiI1rTtD+xN4bKqQslBa8pCJm3h+4uXY+nr21B0FGwjqogrJfrOXS/723bris4YdLSm/H4DbYOXMUh7n9vHf7MU51zzGP5n6Tp0tKawW3cGAHDBr5f4rwkP3nPFEj5/y9MV7+/F9f340u3P4rM3PwUA2DyYw++fWe8//+U7nqsIdMyg49GVm/Hj+1f6WYSBXBFD+SKWbxzAP/zsMTy9ZnvFOYmIiBoBAwNqSq9uHsR1j67CZ296KrD9B4uX4+Yla/C/3uw5+k5x0XFw9QOv4NePvY5LbytPk/nD+1ZUZAxyJScw774ZSJizCG3zVhUezBX9AfErvTtquv6eUCkLAPz11a34wM8fr+n1tz25Dpf/8UUAwL/c+jRueHw1Nnt18noA3ZqyAoN7reAEB+klRyFti18Ode7P/1qx7kNrysbeM6f4j9tb3IG17gFoTVk445C5gXUH/B6DFrtiHYOBbBFdmbQfGOj3v6E/i6ntaczpbsOUlmAw0j8czKgsfmEjHlzeW/H+PnLtE4EZj8IeWt7rX/dvLjgCaVsCpUQf+MXj+O7dLwfON5groncgh8df2xooS6LxxzXqiIjiMTCgpqRnqOlqi54tRw/ga+kx6AsNON0eg+hGYHMlYbN0p5ZaftOc7rbI7fUcRwcCKTv6NUP5YmTGwOwL0I9tS/wAqaM1haKjKq7lK6cf6H/fkgr+1fON9x6MQ+f3BIIJPYAzpyvVSkohZVuR73c3r1fhX888MLA9XI5Uy2JzcQayRbznzbvhuH1nYnZXJrJMyQwAHKfci9LRylmiiYioMTEwoKbU6w2KZ3a2Brbrx7rMRpcSJTUEbx7MV2yLCwyi9hnMFmMHqeEBtKZLZcLCJS5JtnjX3Roz89D2oQKi4ozwZ1FwnMCd++lTWiJXijbfYvh96fUFogb67S0pZAulQAlTyQs8zOPM63GDJR00hc8RbmCOi6GisiQAAjMR9Q8X/BmbdosJDMy+BMeYNjWqDIyIiKgRMDCgpqQzBrNCgYEetOnAQTeO5ovxGYPNEVNV1lIuovcZyBVj79rr2v2w3bpiAoM67kbrUqao4wNA31AhMmAphDIGpVB2YHqHGxikQlN6moFCS+j9ZrxBfNT5prTacBQC5UQ68DDPu8f0dvf8U1q8cwQDnvCUp3HBWFzAYAYauaKDVi+Y2a07EzkrkRlAlRyFQW+tiinMGBARUYNiYEBNSTcBd2WCpUR6LKczBrlaMgYRC1jVljHQQYcDJ6bwOWVJ5GB/ekdL5P7hQWfccQF3ITYgPmMwkIvOZFRkDEoKtmVkDDpa3ebj0AjbPFY6FDSEewhM+j2FezlSliBtDNb1z1Kf1xzIT2mxay4lipteNLxZr90wpzuD9X3DUKHP2lz7QKny9YcbsYmIiBoFb11RU7npidV4cHmvfzdbKYU/PbseNzyxGqcctBu+csdzANzBvlIq0HwcJypjEF7bwNSScqe/zBmD4XCZi2ZbFjpa7YpyJT0oDXtqzXb8x90vY/twHvN62hOvW783M2PQ3mL7qyWnLIEVcevgxfX9OO/aJ3DC/jPhKPfxQu9uPQCkLUHJcSrKgsyBeLjMR2dPwoNrAGj33uvJ33swsN22BelAQOIGSzqQMM/R1Zb2P+Mf3bcCf3h2PV7aMFD55oDI9wxUBnv6c5vdlUG24KB/uBhY38AsJSophYFcES0pKzYQIyIimmgMDKipXOLNKHTcvjMAuAO2T16/DADwlxWb/f2yhVKgZCaplGjNtmF0ZlKBYCApMJjZ0Yp124cDd7Cz+eg75rYV7Bs4fEEPjt1nBo7fb2Zgv0+ftC9+eN8KAMBV96/0t5+9aPfY69DMgeqCae14acMAUpbgzouPxSevX1qx/2OvbMGKTYN4pXcQuuzftgS3X3Q03veTR1EoKVhWVMag/L2ZMUhZgrMOnQsAiPqUp3e45V4DURkDoyTp/GMWoqc9jY8dtyeAYE9AVybtB2LfW7w87qPwrjM6Y7BgWjs6Mml/utGMnzFwexrW9w8HAoMh42fqKIUduSI6WUZEREQNjKVE1JQG/YW4op93VLAURJfP6AZXU+9Azl9QSxvKxwcGuo/BDDziSmkEwVKiGR2t+Ny796+o3z9qz2n44JELKl6fr6HXwRzA7zPLXTH4Q0ftgQPndkUOktdsc9dfMCdqStsWDlswFQfs1olCyanoOwifx/z+i6cekHgXfW7EZ+4ewwocp6stjX855QB/KlQzY9Ddlk4sVzKZ7/nkN832vy+UFD7/rv38xzpjsFu3G7iE10kYzpf8zI7jKAxmi3U1hxMREY03BgbUlAa9O/pRpSuAe4fXHFTrwKCtJXoAu3B6ODCIH4SGp0gFklfg7Wgt7x/XpJyyLf8OtilfZRVlAIGVlnef2h54Lurm+eqtwxXbdBCQti0USk5kj4FZu28+FTVFqflc3AxMKUsCxwyXVwUyBm2pmvo+wtdm9gPki04g2Gjzm4/dwGVjKDAYypf84MHxegymtDAwICKixsXAgJrSDj9jUGtg4O4XXjRLWxjKGIRXQzZ1G4FBi139f0Fzeks7pgDetiQyGKmWMVBKoWB8BjO8On0dMEVN3bl261DFNh2wpG1B0VEolZS/4Jl5jVqwETl+PQFbpGLmqKjjAagIjMxBfGcmHdvHEWZem/ke8qVgYKBnJZrV2QqRiIxBoZwxKDkKA8wYEBFRg2NgQE1J16uXYjMGiMwYxE01uce04J32HUkZA2MmpFrmtDfvWsctYJa2pWLWHqD6tKlFR/lTsgKVg+3wY8D97MIlVXoAnbLdxuroWYmij2sGOyrUZSBSOYNR+ZzB44f3CzQfZ1LIFkuxGaLgdZrXVt5eKDqBQE4HImnbwoyO1si1DPQ+eh0D9hgQEVEjY2BATUk3BzsxGYOtO/J4x3fv9x/rwKA9phRkTqjcJanHoKstZXxfWVYUZmYYogbqgDsw74k4VrWMQbGkAtOP6pWfZ3gNv1E9FQBwyPzu4Pm9u/4tXilRyXEqyp7MAbe5orK5X1QpUZyk54DKHgOlaiutsmIyG3N6Mmg1jpkxvp8Ts5ZBODDgGgZERNTIGBhQU0so7Q8oBwbRpUThOvhwWc9Hj17ol8yYGYOuGjIGHzxyDyzwMhJxGYOULbjktAPwtTMPDGyvNhAuOo5fSnTHp47BWYfMw7ff/2Z8/Pi9AQDfP/tQXPkPh1a8bn6oF0FfV8orJYrKGMSVEpnvKfzj0KVMt110dMU1xPVbaOYQKmwpAAAgAElEQVTd/U7vM8/mawgMjMPqIMG2BL+54MhAVsJsCo9b/Vj3GJQchd6BXMVK20RERI2EgQE1tbhSojC/xyBmcaqKwCBU1nPYgh4cOKcLQDBLMKU1Fdnga5rb04bTDt4NQFLGQDClNYXzjl4Yuu4aMgZFBwfs1olD5/fAsgTnHrHAv9ve3Z7Gew+bV/G6aVOCC6zpcqC0V0oUNStRoETHDAyMwbb+cehBvR6YH75gasU1xPVbaGbGoN37uYUXOYtSNGaL0td5xlvmYHZXJnBMs18gbvVj3ay+fbiAoXwpdsVqIiKiRsDAgJpaXClRmN9jEFFK1JVJVZQYhXsMbEv8mYfM0iBLBB01zFSjB8ixGQNvkBxetbdqKZF3dz+ujj9OV1s6Mkhpsa2EjEH5e3NMn444jr7TnlQtFPdZaK0RMwglrS+hmVkW28gYAMFgI5Ax6M6gb7hQUUKW8aZhfWP7sL8fERFRo2JgQE0taVpRk19KFFEjrhe4SmKJ+DMgmQ3HIqhpppqUP0CNacSNKaupHhg4KJQq+wGq6WhNBWYT0lOepmzx1zFImq7UDjT4mvu5n5G+074zPQbpiEbh7UP5uN195memLzMVFRhkgqVEQOXMRPq8OjAI96IQERE1EgYG1NT6s4Wa9kuarnR2DYM9S6S8FkLa9gfVlgQXMEt6vfs1+vmRBgZbBvMYypfqzhh0ZFKBwb3OhqRtC8WSzhiEpiuNaT5OR5QS6Tv8casQA9UzBmbgoDMQmwZyia9RSgVmctLXrN9LS1yPgfc7sDo0lWurd97lGwcBALNZSkRERA2MgQE1tf7h2gIDPcCOaj6ePzU6Y5AKNNuWB8+ZtF2uoZf4KVCjjhU3Tg6vGeBfd5UegzN+9DCWvr4tcS2BKJ2tqUAGoOi450nbgryelSihx8CKzRi49J32nckYBK7Xaz6+6Pplsfvc8eQ67HnpH7F5sBw82KESLjMwMBdU0xmDNaHAQO+z+IWNABgYEBFRY+PcedTUal30St/tbzUGg+8/fB7Oe/tCzOlxB3sP/L8TUHQcnPz9hwB4d88dt1TJtsRvam1L2/4dcxHxa+HndGdw20VHY1N/Di+s78eltz3rBwJWlUFwXMagUKqth2IkGQMzSNHvzc0YOCg5lQN3M3YxnwtMV+p91QFYcsbAPeCfP3981SDhsPk9mNnZit6EjMF/L13jf3/C/jPxzfcejOsfXx24XvPnYAZGOnuwfSgYaJqLrv3DovmBUqRmIyLXAjgDwCal1MHetmkAbgawEMAqAGcrpbZN1DUSETW75v1XippeS8qqaV57oBwYmAO94/ebiUPm92BWpxsYLJwxBfvM6vTvvpsDXkvEv6ueSVuB0iA9KD9wThfmdLfhkPk9mNkRnNbSNgKJKObdefP7uJWdK19fZ2DQmoJ5JTobkrIsFEqqasbALCuKCkp0j0HSZenPZK+ZHdhj+pT4HeHOfHTWIXMT9zFnIzpobhd2n9rul25VK1vKeNfbF8pAmVmFd+w3M/EYTeA6AKeGtl0C4D6l1L4A7vMeExHRBGFgQE0rk7KqTuep6Tvv5kw3cXez9Uw05oDXssrNx5m07Q84RaTcb2CuBlxnaY85sDcDklrfX/2lROnA9er3lk65vRRV1zGIyR7olYn1gNpOyBjUU0oEBIO6KI4xdW2LHTx/tZ+H/pmHS9N0bwMQnJWpGSmlHgKwNbT5LAC/9r7/NYD3jutFERFRQJP/U0XNLJO2qzbnan4pUcoc6EUPFnW5UTqQMTCCi7RVLk2R8jz+gbn9Q8fWY9a44am5f9oYdRcdFbhrHafWAEKb0moHrkW/Pm1Z/qxE4fdgjvHNoMq8Xj0014P4pBKq+gOD5L/uzOyKLvmx/J9TtRmQBJZUNrObwUi1YzSp2Uqp9d73GwDMnsiLISJqdgwMqGm1tdQeGKzzppuMW73XpAegZsbAFvGn9Mykbb8kSCB+Q6t57NhBb8zmuGxDyVHoaU9HvSQgV+PnoKVsK/D+zR4DRwFbd+QTZyWq9l5HY1aisGoZg8jAwP85JRMRZNI2Vm0ONh+b56x3Sthmo9x0UWTtm4hcKCJLRGRJb2/vOF8ZEVHzYGBATautjozBAy+7g5H4+ffLMunKUiIRwfH7uzXmrSnLLyWyrPKA0Rzch2v+VfR4CUfsOa1i24kHzAo87mlvqdgnLFuobT2H6caKx+aY/ZD5PQDK72UgW6x5ViIzs+JPV9oy/qVE5irYraEm4fBlRE1bm0nbeHnjQOw5mTGItFFE5gCA93VT1E5KqWuUUouUUotmzmz6Xg0iojHDWYmoadXTfKwF7szHhNV6QJwK3RX//tmH4pJTc2hN2eU70SJ+ABHeP4qE7l1fd/7bsHVHcNGub7//zbBEcOvStQCAqV7GYPepbfjdp45ByVF47o0+/ON1S/zX1JoxuPOfjq24e/6FU/fHx9+xF4DgdJ7hunwr5v2lopqPayglquUO/N++fLL/uZqD9F999G04/7q/AQA+fvxe+NmDrwaCxFmdweZv83N//Esn+T0FUddsMgOIehu8m8SdAM4DcIX39XcTezlERM2NgQE1LUuk7sDAHNDGzhDkDVgDzcfiDkwXTG/3zw24JSrmYmf+MWJ6DMLaW1Jobwn+b9yasrH3zA7/sS4lakvbmO7NdjQttEJvrRmD7ra0PzWnfv9v2q3LH8Cbg/XKjEH09+Z+uvm4vI5B/LXUUko00xjgmz0Ghy3o8b9fMM39mfQPF/1tesEyv7fDOFXcWgR6MbNj95mBh1duBhBcKbvZ4wIRuRHACQBmiMhaAJfBDQhuEZELALwO4OyJu0IiImJgQE3LtiR2wB0nbsrN4HG9HgNzBqOYRlzLyBiYg+DYjEGN1SjmoFmXEg0bg//woLrWjIH5nvV3qVBPg79v0qxEZhAUcee/lnUMwj0M1Zh39Lsy5b4L/VmYU436gYFXwhUXBJp0E3W30dPRzoyBTyl1bsxTJ43rhRARUazm/peKmo45vkuqX49jjnXjBu96oJlOaFQ21zHQA8a4Rb9Gwnx9T5s7UDWzAuHj52pc6C1qcG9mRsyypnDZU9xqx4HpSr2vmYjm4/DHvTPNx1bE+zADpxlT3EyDU2U2KFPBW6eiuy06MGj26UqJiKjx8Z8qmpSUUnh2bV/F9sBAcwS//bXMSmRHlNWEgxC/+VgE6VR8KVE4o1HrUNis29elRMP5pIxBbaVEwVIq96vZPLxlsBwYZEPHjAsMzOlKdWSgZwVKKt0arelKo4IwP3BQOmNQ/fh6ZqYeIzCYYpR51ZvhICIiGm/8l4ompV89sgpnXvUwHvFqvTVbqg/skyTdwdb8jEFggbPQcfwVzsoD4+Bd9NCsRHXWPJkDf30H+32HzzOeDx7/vYfNQ5KzF+3uXnegT6DyfR65V3mWpHDfgvla86M3B+Z/91b3PLqPwfx5nfO2+YHj1ZsxaI1oGHavK3icwCxJ+nprCMl0GZWZMQj8TDkrERERNTj2GNCk9NKGfgDAmq3BeeUDpUR1DizDr4l7vd7eEmg+jislKvcYmHvEDXpH0mPQkrLw3L+dEqixNwfj4eeifPv9b8FlZx4UWWtvBgbvO2wesgUHX7r92YrAIG6QbAYpXz3jQPy/U/bH315zF8g1T/f1sw7GAXO68NU7nqs4Xi3aIqYYDZ//n07cB5965z7+Yx2P1XKqoldKZK4bEbfaMxERUSNiYECTUtwd3ri59GsVLEVK7jEIlBLFzNDjrnzsPjD6diuOXW+TdHB2IMu/A29u08LPRbEtwZTQfvoQ5h12EcHsLrc+fygfDAwkppQo/Dl1tKb8beFArCtTvoZ6m3nj1jEwa//bW1KB/ZwRlBLFZQyavfmYiIgaH/+loqZSS/NwksDMQdVmJQpNVxq8jnLGQGcWzAW2drboxByEpiNq6EdjFV4dfIXLnnT2YTgf37cQXMwtPguRNLNReJ2EajKp6L/uzOuvmCbW+1rLrESFkm4+jl4Ejs3HRETU6PhPFTWV4Gw0I3h9DRmHqAXOwvvqgaYYGYOoPoKRlqWnA3fhK/83T4/C3eu4a9MlO9mEKVDNzyO6PKmyIRsIfqY7MyuRyRywhwOmejI1RS/lEyglkuSfAxERUSPhv1Q0qSkAL28YwIqNAwB2vpSolppxO2JQW9lj4H41Vz421wAIq6cJ1r1O4y54xJ31eu+2R9FHcEKjZz8wSMgYVGvE1Z9JXKYFGMmsRNWbjyszBqpinzj+rERGYFDLuhdERESNgoEBTUrmGOyUKx/Cu37wEID6S4mO3HNa4HEtA1M9ALSs+H3NdQzSET0GU71FyT523F4AgHfuPwsAcNKbZlW9ZiAYDERlB+q92x5FX9ssY3VhAJjX0wYA+MjRe8S+1rKA849ZGPt81NoOQPIUsNXoY110wt4AgLndGbx9r+mBsqtUqN4nauXjOJ8+yW1a7jQWT7N2ovSJxoZCnQ07RERNhM3HNKmFS0GCd/zjB2qrrjjd/37hJX+IfE3cwFQPugOrBFfc+dZfxb+77xiRQVuLHbiGN+/eHXhcTSohKAk/P1IfOmoPfOioysF/ZyZd9VptEVx25kG47MyDIp9viVjbIfw46ecXx7yuRy91F9x9/NUt/raKjIFuPq7h2BefuC8uPnFf5I0SqkAgyowBERE1OGYMqKnIzpYS1TAw1QPxpIyB32OA8uAxXJKzM6o1H4+k8Xo0Vfvs4zIGY3HdZpYgrsegnl+VuKBsoj9zIiKiahgYUFMJ3sEdweuN/2Nim4/9HoP4ffUgUUT85xJaDOqWTpgqVZ93IlW7259O6R6DsQ8MzPUmwlOK1tvbAYQb3BkYEBHRroOBAU1KtYx7R1KKYov4A7z46Uol8BWIbz62RPzrGM2MgXnu9C44T2Y6IusCjE05TnDNh+Dx61nHIAqbj4mIaFfCHgOaVO5/eRNmdpSbYcONhiVjBs2RDNQsEVgClBA/K5G+6xyclSi4jzld6ViUEqUTymN2Bf46BqFLH4v3Evys4pqPR3beQIZqF/w5EBFRc9n1biUSJTj/V3/DGT96OPZ53Ux62ZkH+gP3aiUehy/o8b+3LKn6uqiMQdLKxzpASZqutF4tKbM8Jvo6D5zThUtPO2DUzjma/HKs0LXPn9qO2V2tOH6/maN2rpaEIOqcI+bDtgTvPnB2Xcfcd1YHvnrGgcHfAWYMiIiowTFjQE1DKQVHKXzk7Xvg/GP2xKW3PQvAHbQnDcpvu+gYf2Yi2yqXElVb4MwcFIbvOJsrH8sY9Bh0tJb/1w7XzWt//Mxxo3fCUVbOGAQ/t1ldGTz+pZNH9VxJpUQH7NaFVy5/T93HXPy54yu2sceAiIga3ahkDETkWhHZJCLPGdumichiEVnhfZ06GuciqodZnZMrOig5yrjj726vZ+pOW6S8TkGVHgPz6bh1DMToWXBGMTLoyJQDg11xQFpe4Gzsrz2d0Hw8mnbFnwMRETWX0fpX8DoAp4a2XQLgPqXUvgDu8x4TjZPK8pxcwYFS5QG7XWMpUeCoUi5viXtd1DoGlT0GxvHGoMdgSks5MNgVm49ty+3lGEmDeL3MGZzGsh+DcQERETW6URkxKKUeArA1tPksAL/2vv81gPeOxrmI6lEwuo2zxRIcpfwBuy7hqStj4A1YgXK/QuU+Uc3HcaVE5cFvaRRLicygZVdsPgbcgGY8YppgxmDsPquJniKWiIiomrH8Z3e2Umq99/0GAPV17xHthBufWA3ALR/SsoUSHFV5x9+uo3zEnK60FBsYuF/NGZHi5uO3jNKkuEBjZ43lYHcspW1rXBp2zcBpV8yuEBERjZZxaT5WSikRiRz1iMiFAC4EgAULFozH5VATMQOD4UIJJaXKpURWOWNwwbF74qC5XfjLis0485A5scezLMFPP/RWXPPQq5g+pTVyn6hm4rhZiUQER+w5DcftOwP/esaB9b69moSn4NxVnPO2+Th6n+ljfp60ERiyD4CIiJrZWAYGG0VkjlJqvYjMAbApaiel1DUArgGARYsWjc0tU2pa+UDGwIEySonMaUe/6g3K33/47lWPuWjhNCxaOC32efFLjcrbKseb4v83k7bxmwuOrHrekdpVMwZfGaNAKczsY0jvomVXREREo2EsbyXeCeA87/vzAPxuDM9FFClbKAW+d1Swvh8Y/Rp88Qb9ZilRuL5cPxyPWXd21cBgItRTVkZERDTZjNZ0pTcCeAzA/iKyVkQuAHAFgHeJyAoAJ3uPicZVrhgMDNzpSt3HUQuRjQZ/rF9D/ms8xuwsj6kdgygiImpmo1JKpJQ6N+apk0bj+EQjlS0YPQZ5N0iwrFAp0SjftddHq2X60fGYqIaz4dRuV53BiYiIaDQwb06Tmg4GAGBIBwah9QtGe9wc1WMQvy8Hoo1kLBc4o8YwRpN/ERFNCuMyKxHRRBk2egz0DEWWX9/vfhWMVY9B0j76GsYuMLj9oqPxxGvh5UUoCZuPiYiomTEwoEnNbD7Wi535pUQNkDEYy5L2wxZMxWELpo7dCSYh9mNMfkzSERHFY96cJrWsMV2pHxiMUW+BpsuDVELOQJ+ag5TGwgXOiIiomfFfQZrUsnkzY+AO1MOzEo12OY8/KVFCxkCXG43HdKVUO2YMiIiomTEwoEltOKqUSHQJ0ViXEtUyKxEHoo2E05USEVEzY2BADWPp61txyL/dg76hQuJ+mwdzWPTNe/Hcuj589+6XcP6vnojd1wwMvr94OYByYKAbTUe7fKSOZQzGZR0Dqh0DNSIiamZsPqaGceW9K9A3XMCyNdvwzv1nxe73+KtbsXkwhx/9eQXufn5j4jF7B3IV2/Rg/F0HzsZrm3fgpANmV7223//TsVi3fbjqfkC5qbmm6UprOuLkccvH34680fdBREREjYOBATWMotcDkK4yl/y0KS0AgM2D+ZqO295i+2sYAOWB+5zuNlx25kE1HePged04eF53TfvWssCZvjFtNVnK4Ig9p030JVCDEZF/BvAxuEm2ZwGcr5TKTuxVERE1J5YSUcMoOe5Autrqs3osvXmwMhsQZV5PW+j1YzwY92clqmXX5goMiEwiMg/ApwEsUkodDMAGcM7EXhURUfNiYEANo+C4JSbVFpkqegHE5ogyoSjzpo5vYFDLrETlaxnTSyHaFaQAtIlICkA7gDcm+HqIiJoWAwNqGLqUKFWllEgHBjuM8qAkc7ozgZmHxnowXj5XDesYNF2XAVGZUmodgP8AsBrAegB9Sql7JvaqiIiaFwMDahh6OtFqc8kXS/U1r87uygSmoRzruv7pU1oBALM6M7H7lNcxGNNLIWpoIjIVwFkA9gQwF8AUEflQxH4XisgSEVnS29s73pdJRNQ02HxMDUNnAqqV4OiFysLi1g3oaE155UN6gbOxHY2fctBs/Ojcw3DqwbvhvYfNw/ah+CZpLnDWGB78lxNq7lmp1x8+fWzVLFgTOxnAa0qpXgAQkdsAHA3gt+ZOSqlrAFwDAIsWLaqlfYeIiEaAgQE1DJ0JSJrNByg3KYfFvawlZSFlCfSwb+xLiQRnHjIXALDnjCkApiTsPLbXQrXZY/oU7DE94ee0Ew6aW9tsVk1qNYCjRKQdwDCAkwAsmdhLIiJqXryNRQ1DZwKqBQZFJ7qUKO51LbYVKB+qVqo0npgxoGamlHocwK0AlsGdqtSClxkgIqLxx4wBNQw94I9JCPhiS4li9m9JWY13Y16vY9BwF0Y0vpRSlwG4bKKvg4iImDGgBlLyewyU/zhbqJx5qFRvxiBlBYKGWqYRHS/MGBAREVGjYGBADaNcSuQ+/vwtT+GAr94Vu19YbI+BHfw1zxfrm9VoLDEuIBpfjXRjgIio0TAwoIYRbj6+4yl3naNws3G9zcfplBWoM8rVOd3pWGA8QERERI2GgQE1jIIT3Xy8I18M7hczsI8rJWq1g6VEuYjypPEmTBUQERFRg2FgQA1DZwzC4/vBbDAwKMZlDGKO25IK/prHlSIRERERNTMGBtQw9Hg/fOd/MBcMDOJKiRKbj43nGqnHgIiIiKhRcLpSajjhcf+AkTFYs3UoshRo2448+rOFyOOFMwb5UgOUEk30BRARERGFMDCghqPv7tuWoOQoP2Owvm8Yx33n/sjXHPaNxbHHC89K9OZ5XImWiIiIKIylRNRwdNVPylv9S/cYbBnMj+h4Zsbgi6cegFMPnrNzF0hEREQ0CTEwoIajewV0YLAj1GNQL3OBs/nT2nbqWKONc6oTERFRo2BgQA1H9xikvBKggZ0MDFpt2/9eBxsTTc9WqmLnUiIiIiIaXwwMqOE4Ro8BUDldab3SKfHvzNtWY/zKN0Z4QkRERFTWGKMkmrRe37IDa7cN1fWav722FdlCyV/IbDAXPdtQrVpsy78z3ygZA42lRERERNQoOCsRjanjv/sAAGDVFafX/JpfPPwa3ugbRq6gAwN3elFzseDWlIVcjesRpIxZiewGCQy48jERERE1GmYMqCGo0K3z+1/qRd7LGJQc96sYBThTWuNj2s+/a7+I47tfGy1jQERERNQoGBhQQwgvajZsLGJWLFXW27Sl7YptWibhuUbJGBARERE1GgYG1BBK4cjAUIx4rr0lfvCfsisH/yrhuYnEHgMiIiJqFAwMqCE4CSPkolPZS5C2LaRjBvkpO/7XmrMSEREREUVrjFESNbxn1/bh2bV9o3a8Pz27HtuHyisZJwYGEaVEaVvQEhMApKPKhRq0x4AJAyIiImoUDAyoJmde9TDOvOrhUTnW+r5hfPL6ZfjUDcv8bVGlRK0p99dTlxKZi4HZlqAlFf3ra2YM9pvdEXiOPQZERERE0RgY0LgbyruNxW9sz/rbwtVCPzr3MLz8zdNw6Pwefz0DM6mQsq3YwMAsMbrnn493X9to6xjolY/ZZEBEREQNgoEBjTs9GDan8g+XElnekylL/GxCIDBIyBhYEWsElFc+bozAQNhlQERERA2GgQGNOy8BANsYwJdCgYGuBkrZ4vcYmMFDyrZiewyS1g5LNUjzMREREVGj4SiJxp0e4Jt39h0nOmOQti1/ViIzMEhbgpZU9JSlkRkD76vdYNOVEhERETUKBgY07pyIUqLKjIH4X3XzsRk7JDUfJ1ULNUyPgYcdBkRERNQoUhN9AdR8dKOxWe8fnpXIsnSPgYVCSfcYmKVEgpbYu/+CY/aZjjPfMtffol/bKD0GHz9+Lzz2ymaceMCsib4UIiIiIgAMDGgCRJUShSfnCTYfe7MShZ5Pyhhc/7GjIp9rlIzBfrM78eilJ030ZRARERH5WEpE406XDVkJGQPdmBxoPnZC6xjENh8n9Bg0SGBARERE1GgYGFBdwk3CI6GDADuhx0BPHuQ2H0f0GFTJGMRhYEBEREQUjYEB1SVfcqrvVIVesCxpViKdMbAtQdFf4Ky8j1XvrEQNto4BERERUaNhYEB1GWlg8MuHX8ODy3sBlDMGRUfh0tuexab+LMKJCF1mlLYFhbiMQUwpUdLaYVzHgIiIiCgam4+pLvniyAKDb/z+BQDAqitO93sGnlqzHU+t2Y6+4Twufue+gf0tI2NQ8gODUMYg5u5/VMbg9ouOxu+fWZ9YZkRERETUzBgYUF0Ko1hKpCkVHPQD5ZIfd7rSygXOUpbElgVFbT5swVQctmDqzlw2EY0BEekB8AsAB8OdJ+AflVKPTexVERE1pzGvqxCRU0XkZRFZKSKXjPX5aPSZ9f8jzRiYwjMQicTPSpS2yxkDc4+kBc4kqZaIiBrNfwK4Syl1AIBDALw4wddDRNS0xjQwEBEbwI8BnAbgQADnisiBY3lOGn3FUQ4MChWBgVRkDHQ1kG1ZfulRoPk4oceA5UJEuwYR6QbwDgC/BAClVF4ptX1ir4qIqHmNdcbgCAArlVKvKqXyAG4CcNYYn5NGWdEpBwO5UckYBI8hiC8lStvin998mW0hNmPAhAHRLmNPAL0AfiUiT4rIL0RkykRfFBFRsxrrwGAegDXG47XeNtqFFEpGxmBUegwqMwbhw+rAwLYEjnLLmcLNx+nYjAEjA6JdRArA4QCuVkodBmAHgIqSUxG5UESWiMiS3t7enTrhzq/EQkQ0eU343I2j+Rc+jY3SKJcSFcOBASp7DCy/x8D9FS04Th0LnDEwINpFrAWwVin1uPf4VriBQoBS6hql1CKl1KKZM2eO6wUSETWTsQ4M1gGYbzze3dvm41/4ja9o3M4fnebjUCmRVJYSWX6PgXivUYEeg8TmY8YFRLsEpdQGAGtEZH9v00kAXpjASyIiampjPV3p3wDsKyJ7wg0IzgHwgTE+J42yUW8+LlVmB+KnKxX/NSr0mlY2HxNNBv8E4HoRaQHwKoDzJ/h6iIia1pgGBkqpoohcDOBuADaAa5VSz4/lOWn0FUe5x6BiutKIbeFSolKoxyA5Y8DIgGhXoZR6CsCiib4OIiIahwXOlFJ/BPDHsT4PjZ2CUfozKguchUqJEFFKZDYfA245U6DHIHEdAyIiIiKq14Q3H9PEenF9PxZe8ge82jsYu495Nz9XCA7ql6zaivf851+QLZQC23PFEva69A+Rx6tsPq6clcgyFjgDgLN+/EjFOgZtaTvy+Gw+JiIiIqofA4Mmd8eTbi/43c9vjN3HzBJs3pELPPf02j68sL4fW3bkA9u37sjDiZkXsFhRNhTRfOz9ZtreN+v7sqFSIuDofabj1IN2qzg+AwMiIiKi+jEwaHK6Hl8lzO5tZgw29GUDzw1miwCCMxeFXxMW3lfEXafAZIcyBkBwgTNLBK0pGx9++x4Vx2dcQERERFQ/BgZNTg+iVcKqP+YsQhWBQa7g7VN7YFDZfCwoxc5KVP4VVRHPRwUBDAyIiIiI6sfAoMnpMbRKiAz0Hf60LdjQHw4M3IxBeArSpMCgcuXjiGDBG93niuXehfCsRO71V0YBUduIiIiIKBkDgyan6/ETxvH+oHbMRQgAACAASURBVH33qe1YX5ExcAfu9WQMihULnElFxkIP/DcPlnsaws3H7tfK41v8rSYiIiKqG4dQTa6mUiJvkD+vpw2bB3OBHoHBbEwpUVIGoiI7UBlI6B6Drkza3xaerhQArIjIgM3HRERERPVjYNDkamk+1oFAd3saSgHDxtSkcaVE4SlJo47nXwMqAwl91//sRfNxyPwe93VOZSlRVMaAYQERERFR/RgYNDk9iE4qJdID8s5Wdz28rLGWwUBWBwbBwX7cCsmOoyIzBuFZifxSIUvw7gNnu8cslo+pMwpRqxxz5WMiIiKi+jEwaHJWDbVE+u5/Z0YHBpUZg3CGIC5jUHCc6AXOwrMSGYN7PWVpIDDwMwZRpUSxb4WIiIiIYjAwaHJ6EJ2cMXAH5FNa4wODcIYgnEHwj1VSETMQVZ7f7B1I2+6vqRkYWP6sRJWYMSAiIiKqHwODJucnDBJ7DNznOkKlREopY4Ezd58tgzkopSrWOzCPFQ4alKosJTKlvMBgQ/+wv80WZgyIiIiIRlNqoi+AJpbUMF2pzhj4pUTe2gK5ouP3CxRKDv766hacc81f8a4DZ2PxCxsjj1VwnIoeg5KqzCKYWrxSohufWONv82KF6AXO2H5MRDGS1mwhImp2zBg0OfFLieL/sdQlPHrqUF1KpMuIADcweHrNdgCIDQoAN2NglgQB7j/USedPRSxMYCVkDFhJRERERFQ/BgZNrtx8HL9P3isT6mrTgYE7sNdlRIA7XWkt9+EKJaciMCg5yYFBOlX5a1pex6By/6i1DYiIAPYgERElYWDQ5MrTle5cxqDoOInHKO+nkKtYJdn9EycdtYhZwqxE/GefiIiIqH4MDJqcHsonjen9wKDN7THQC5wNGBmDfNFJPIZWLDkohDIGTpVSIj0rkclfxyBif658TERERFQ/BgZNTjf9JjUf50sl2JagvcUNDHKRGQNVU1NfoaQqpjZ9fcsObN2Rj31Nyq4c6OtSoqiyAFYSEREREdWPsxI1OR0YJHUI5IsOWmwLmbQbR/o9BrmCv0+h6NTUY1B0KnsMlq3ejmWrt8e+piUiY1BuPo54AQMDIiIioroxY9Dk/MCgSilRS8pCJm0DMHsMygudFUq1lRIVImYlqiYVVUqUuPIxIwMiIiKiejEwaHK6tj9pHYF8yQ0M0raFlCX+OgaBWYmqzCykFUtORSmRZsfUAKUjS4ncrwwMiIiIiEYHA4MmpwMCvYhZlJxXSgQAmbQdKCWyLUFb2nZLiWqclSguY2DHDOijmo/14D96gTMiIiIiqhd7DJpcSemVi6v0GKR0YGD5sxINZovoaE1BKeU2H9dwvqh1DDTLAlCq3B45K5EVHxgwY0BERERUP2YMJqnBXBF/WdEb+dxDy3v9GYUcL2Pw6MrNgZmBNvVnsfT1rQDcwbzOGLSmbGQLJWQLJdyyZC06WlNoSVnI19hj8NgrW+JLiWIG9EmzEkUGAYwLiIiIiOrGwGCS+uxNT+LDv3wCG/uzge3rtg/jI9c+gc/f8hSA8sJib/Rl8eFfPu7vd+ZVD+Pvrn4MQDBj0NbiBgYPr9iM4UIJnZkU0raFYslJnNlI+9lDr8Y+F3enP2pWouTm46qXQUREREQhDAwmqZc2DABARdnOcN7NFKzYNAgguOLx82/0+99v7M8BAJRSfvMxAHS0pjCYK2H7sDtV6dUfeitStqBQUolrIdQirgIoMmOQMF0pS4mIiIiI6sfAYJLS432rYuTsPfaeT5qNCChPL6rv2ndmUhjMFrDDK0XqbksjbVsolJyaZiVKEldiFNl8nLDAGeMCIiIiovoxMJik9IC/IiwIxgV+83GcbLEUKCVyMwZFv0dhSquNtOUGBjV1HyedqxATGFgRpUTMGBARERGNKgYGk5Qe8Ifv4ushs55a1KmSMcjmS+50pWZgkC1iIFtEi22hNWUjnRIUS7WtYzAS6VR883FUxoCIiIiI6sfAYBJYu20Idzy5Dtc98prfU1Ae+Af31QNpP2NQJTBYtnobXtow4AcGU1pTGMgVMZgroCPjznabstxZierpMYhatCxOKiJjYFnxGQMiIiIiqh/XMZgE3vvjR7F50G0WHi44+OQJe/sD/nCpkN6uN1crJfrEb5cBAFrNHoOcmzHoaHV/fdK2oFDjdKVaJmWjUCoGtr37wNnozKSxfSgf2B658rFUZgy+eOoBuPqBlZGzGBERAahpIUYiombFwGAS0EEBAGwfdgfVTkxzsS730VOLVssYaPoOvbugGdA7kPMDg5RloegEm48vOmFv/Oavr2MgW4w8XmvaxkCu/NzVHzwcp715TuS+IoJlX30XDv/GYuN6vK9GzPDxd+yFT56wd03vh4iIiIiCeGt1ktFjc907EK77r8gY1BgYDGTd6Ul1+dCG/my5lMgWFB2FolG3lLKtxHXGMungr16qyl1+O1QzZPnNx+XtlTMwEdGuQERsEXlSRH4/0ddCRNTMGBhMMqVQQBAe+IcDg3DgoAOK8EBcr4qsswQb+rJGxsBtPi6WysdKWZLYGBw+frWeg1Rof/2IMxARTQqfAfDiRF8EEVGzY2AwyfgBQUxgEJdB0IYKJQDlGn5tSygwGMqXyoGBt45B0ThWeFGy8MDfDCLc5+vLGGiMC4h2bSKyO4DTAfxioq+FiKjZMTCYZMolRN5jpTCUL+Jbf3gBQ/mikTFQeG5dH+5+fmPg9XrhsmoZAwDGrESClzYM4Nala/3n0pYVGLSH7+wXQ9MlVQsMKjIGfvNx4suIqPFdCeALAKIXMiEionHDwGCS0QGBnnmj6Cjc9MQa/Pwvr+HqB14JZAjO+NHD/vezu1oBlBuZwwPxn33orQCA9pZyYNCett19Iwb14cAifLzj9p0ZfL5KKZF5vBP2n4metjQAoMW2cMZb5uA3FxyR+HoiajwicgaATUqppVX2u1BElojIkt7e3nG6OiKi5sPAYJIpL2zmPnYc5d/lX7d9OLLZ+OB5XbjaG/hv7M8CAGxjoP7WPabiyL2mA4C/noH5fTqizCdcOmQ2Bt904VGBzAOAqlOMmv0K151/hH88EcFVHzi8ItAgol3CMQD+j4isAnATgBNF5LfhnZRS1yilFimlFs2cyf/XiYjGCgODSUaFegtKjsLUKS0A3ClGS/50pWWFosJuXRkAwIY+N2Ng9hiY35uBgS7/iar/t63grERmxiBtWxUBSrWMARFNPkqpS5VSuyulFgI4B8CflVIfmuDLIiJqWgwMJpmKWYiMZuPegZy/ErLZg1woOZjZ2QpLgA19wwCCd/jNhYejMgZRpUQpOzgrkR0IDKTuHgMiIiIiGltc4GySCVcKOU45WAhmDMo75ksO0raFGR2tWN/nlhKZq4OajcNmiVCrDgxiSonMrXYoY1AIz0pkMTAgamZKqQcAPDDBl0FE1NQ4GptkwtORfuK3S7F66w4A7pSjn/iN2+MXzhgAwJzuDDZ4PQbmwN0c1Lfatv99OWMQXUpkSllmCZKgWAplDFIsJSIiIiKaSAwMJhknlDIYzBVx+R9f8h8Pe+sUBHoMvCCgp70F/cMFb1t54G7F9BjohuGoMqC0JYGpRMMZg6JT3zoGRERERDS2OBqbZCImHYoUyBgU3SAgk7aQLbjfF2MyBlE9BlHNx+G+A3OflG1VLnDGUiIiIiKiCcXR2CRTUjVGBqEeAwDIpG0MF0pQSvnbAMCKufOfNF2p23dQR/MxS4mIiIiIJhQDg0lG1RgYRPUYZFI2soVSxcxG4VWLtRZ/utLoWYkCj82AIqKUKMWMAREREdGE4mhskolawCyKQjkToF/S1uIGBuEZg6JKhYBqzcfBHgMzuIgsJeI6BkREREQTitOVTjK19hhs3ZGv2NaattCfLeLE7z0Q2G7FBQZ+83HUdKWhBc7sYClRITQrkcRkJYiIRlOtxZZERM2IgcEkE56VqB6ZlDsVqV7LQIstJUollBIlZAzSVrmU6Dt/95bYwIOIiIiIxg9LiSaZ8DoG9cik7cjtcVU+fvOxt8Ob53X7z4V7BlKBlZTFDwz2nd2Bv3/r7iO+ZiIiIiIaHTsVGIjI/xWR50XEEZFFoecuFZGVIvKyiJyyc5dJtSqp2huQw9rS0b8OsaVEoelKzQxBuO8gfAy9wBmbjomIiIgaw86WEj0H4P0AfmZuFJEDAZwD4CAAcwHcKyL7KaVKO3k+qkIpVTHjT63iMwZVegziSomMLoNURWDgXmNU4zIRERERjb+dul2rlHpRKfVyxFNnAbhJKZVTSr0GYCWAI3bmXFTmOCp29qFiSVXM+FOr2MCg1oyB8VzSAmcAUHB0xoCBAREREVEjGKs6jnkA1hiP13rbmtay1dtw7L//GQPZQuJ+q7cMYeElf8BfX90Su8+7fvAg3vSvd2HTQLbiuULJCSxOVgs9Ns/ElBLFzRhUMV2pBDME5st2n9oeeO187/GUVva/ExERETWCqqMyEbkXwG4RT31ZKfW7nb0AEbkQwIUAsGDBgp09XMNasXEAa7cNY/NgHp2ZdOx+T67ZBgD4zWOv46i9plc87zgKr/TuAABs6MtiVmcm8HzBURjKF2u+riMWTsP3zj4EQGXGwLYEJUfBjgkfW213/7S3Q9z0pP94zJ74wqn745PH7431fcMAgB+ecxgef20L5va01Xytf/rMcTWv00BERERE9akaGCilTh7BcdcBmG883t3bFnX8awBcAwCLFi2atKO+fNG9i19yku/mT5vSAgDYPJiLfH6oUG7T0Mc0FYoOduRqDwwOW9CD+dPcu/fhwGBeTxtWbx2K7zFIaj62yusYnHnIHGTSNhZMb8eC6e65utvTePdBUfFmvDfN6aprfyIiIiKq3ViVEt0J4BwRaRWRPQHsC+CJMTrXLiHnBwbJ++mG3agFyAAEBv2RgUHJwUC29sAgZxwjHBjM6XazEXGzEulpSvVXCT2nS5C4eBkRERFR49vZ6UrfJyJrAbwdwB9E5G4AUEo9D+AWAC8AuAvAp5p9RiJd91+skjHQKwJviQkMzEF/LiLKKDoKg3VkDMx+hHCPgQ4U4hY40w3GeoEzMwAwm43ZX0xERETU+Haq81MpdTuA22Oe+xaAb+3M8RtJoeTAEomdoacafXc/KS5wHIUdXn9AXMZgMJQxyBaC8da6bcN1ZQyisg6afq/V3nM6YlaitNGYIGBkQERERNTouLpUjfb98p9w7jV/HfHr9QA8KWPw7T+9iItveDLxOIPGoP/H96/EAV+9K3iekoMr711e83XtNXOK/31HaIYgHRCEMwa7T22L3M/czTZmJWIlEREREVHj41yRdXhi1dYRv9bPGCSsSvybv75e9TiDufJ0p8+s7YvcR89aVM0XTt0fH3/H3v7j3ae24/aLjkZ7Swo97Wlc9rvnAaBiVqL/vfhY9BrN0fodxS1oxsCAiIiIqPExMBgnfo9BwuJjtczEOZhLbtWY2p7GtqHktRK04/aZWVEmdNiCqf73th2dMZg6pQVTvdmTACAq1hEpZwziehSIiIiIqHGwlGic+NOVJmQMVMJz2mCVBdL0FKKtqeo/2pYq++gBfbWBvfJyBnG7MTAgIiIianwMDMZJeR2Dnc0YJDcW68F+Z6Z6MshchCyKfrbWhuu48T/jAiIiIqLGx8BgnOipRZMCg/Bz/dkCthi1/JsHc9jQn008T4vXEBBuJE7aN44e0FcNDLzLDs8+pB9zulIiIiKixsceg3FSqCFjEHbsFX9Gf7aIVVecDgBY9M17AQDTp7TErnPQknLXHphSQ2DQ1ZZOfF6P56vd8Z/T485SdMw+09GfLeD5N/pDr2NkQESNoYaKTSKipsXAYJzka8gYhPXHrEcwuyuD/mwBhYhGZl1K1BZaxTjssUtPRHe1wMAb2dtVIoM9Z0zBw198J+Z2t+GCY/fy12LQr2LGgIiIiKjxsZRonNQyXWmt5nRnYsuA/n97dx4k6V3fd/z9nb7mPnZntPcltOgMaKUNSIUAFxLWAo4IBVVICVgOTpQ4cXEkFUcqiGNXwBhfYAJGkvEB4ZIFsk1JWIokDoPllVihew9ptfdqZndmdnbuPp9f/nie7unp6Z7tne6e3un+vKq65rmf36+f7p7n+/yuWLC8tSAwKKwOtK5n/lgEiymnjcHGvnZaWoy2aIj+zljZxxYRERGRC4MCg2UyN8BZ5YHBmp7Wkj0KRcL+TXxrZP76cnopKjT3xH9pj/xNrY5FREREVgwFBstkKVWJ8nl5+8XCLSUDg2iJEoOlBAbkxiE4/13zqUqviIiIyIVPgUEZyhlfoNCRkWkGx2dz8+V0V1pKOuORCPbPKhkYhEsFBou3OSgm26tQud2VLtxfRERERFYKBQZlWMrN/C/90Y+5/rM/zM1XEhjE0x7x1NyIx++47KKSbQyyvRItqEoUWfqlbqmwyEC9gIiIiIhc+NQrURkWG624XIlKAoNUhlRQFel3/tUVvHX7QC4AKJSrShSuvCpRbhyDpbYVUJGBiIiIyIqhEoMyLLVdQL5cG4MlBBmzyQyzSb/EoLc9CkC0xKjF1a1KFPytOC5QkYGILGRmm8zsR2a218xeMrOP1TtNIiLNTCUGZahKYHCOEoN0xiu6HCCRzpBM+/tlqwiVamOQvYmvRq9Elcr2SqSqRCJSQhr4b865X5hZF/C0mT3qnNtb74SJiDQjlRiUwSt9z162cwUG8XTpk8RTHvG0X2IQC0oCSgUG2YbSC0oMltDGQL2NikgtOecGnXO/CKYngX3AhvqmSkSkeSkwKENh9Z8DQ5M8c2zsvI6RbSPw4PODTMRT/O0zJ3LBAjCvcXGhLzz2MrsPjQJzbQdKNT7OBjHV7JWo0if+KjAQkXMxs63ADuDJ+qZERKR5KTAoQ+FT/pu/8I+878+eKHt/z3O5gc2ePjrGmz/zOJ+47zn+8JH9uW0m4+mS+z+27zR/8PABANqiC0sM3vb6gblzBXfx0VALV67vzi3P73L0DRt7ykp3tsRgqTf2v/H21wH+SM0iIqWYWSfwPeDjzrmJIuvvMLM9ZrZneHh4+RMoItIk1MagDF6Fj8yTBe0HZoPSgX2Dk7llQ+Pxso4118bADxD+xYYevv6RN7H1zoeCtPrbmcFDH30rdz3wAt9+6hghM478/nuWlP6lZv/9127k/dduXNrOItIUzCyCHxR80zn3QLFtnHP3AvcC7Ny5U4WQIiI1ohKDMlTa+LhwcLKsM9PJ3PTQxGzRbQoVViUqHHwsG8S0BI/7w8H6UIlejBajNgYiUkvm91DwF8A+59yf1Ds9IiLNToFBGUoFBuWOiJwsJzAYT5R1rNaCxsfhgsAgm9aW4MpmA4eljUUQtDFQKwERqY23AB8G3mFmzwavd9c7USIizUpVicpQqipRIu0taORbTGFVoqwzM/mBwSxdreFF2xoAtAXny3Y/Wm6JQWEAUY5cGwPFBSJSA865n6GhEEVELhgqMShDqRKDqYR/E//g86/xwolxAHYfGuXxfady2zjnSpYYJNMen3loL8fPzPC1fz7K2u5zN9KNFYxjEC6oIpS9ic8GBtkqRC1LCAxyx1zyniIiIiKyUqjEoAylSgym4mn6O2P85reeAeDI77+HW+/dPW+btFc6MAD4858e5sx0CoCdW1fx+rVdJFIZHtt3OrfN5z/4Ru75ySF62yO5koJIcMMfCuoM3XT5RVyzpY+3bR/gmWNj3HBJPwA7NvUy0BVj55a+8863HuOJSMPRkw4RkZIUGJSh1KDE2RKDxSTTXsnA4AsfvJqP3/cspyf9Hok+9Z7L6YiFeem18Vxg8ImbXs/7dmzkfTvm9+4TDflVirJVhL56+7/MrXvirhtz07uuWseuq9adM53F5JolqC6RiIiISMNTVaIy5Fclym9wfK72ABAEBpnig5f1tEUAGJ1KYgbt0ezN/txlKawqlBUt0cagmnIDnNXsDCIiIiJyoVBgUIb8qkT5XY+WVWKQ8Up2V9rd5hfYjEwl6IyGsWy7gLyb/VKNhkv1SlQLKjAQERERaXwKDMqQX2KQSM3d5E8n0njnGOMgmfZIZYpv093qlxiMTCXobJ2r1ZV/sx8OFb9Ey1FiICIiIiLNQ4FBGTJ5j8w/98j+3PSZ6ST/43vP5+a/+tNDC/ZNLNLGoDuoSuQ56IzNBQbllBjEQrUvMZjrrlRFBiIiIiKNTo2Py5BfKvCtJ4/lpu9/+gT7Bidy859+aN+CfUs1Pg63GG3RuTEQ5pUYhKzodL65EoPaxXYfvXE7w5MJ3n/txnNvLCIiIiIrmgKDMqRLVBc6Njp9zn2TmeKNj6PhFlrDeYFBiRKDSIkb/+VoY9DfGeMrH7q2ZscXERERkQuHqhKVoVQ7gulk8d6G8pUqMYiGW4iEjOx9fX5gkN8rUak2BNGgKlGoRImCiIiIiMj5UGBQhkyROvb5N/KLSWWKBwaRUAtmRmsktOB489oYnKMq0XL0SiQiIiIijU+BQRkyRUoM1ve2lrVvMl28u9LsE/+2bGBQqleic1QlUq9EIiIiIlINCgzK4BUpMehti5a1byLtkSwydHIsuLHP/j3fEoPIMvRKJCIiIiLNQ4FBGQrv6//T21/HBwp66rl0TVfuKX6+2VS6ZBsDgJmU305hdcdcoDGv8XGJwCAbULQoMBARERGRKlBgUIb8qkSrO6Lc+a7L2NDXNm+b/3XLFVzc37Fg36m4HxgUVvnJBgZnZ1IArO2Zq5oUsrltS3VHqjYGIiIiIlJNCgzKkF+VKFuFJ/9GHvwn+IXLACYTfmAQLRjBuHB+bc9coNEyr7vSc/RKVMNxDERERESkeeiusgz5JQaRsH+jvrZ7fhAQDYVYVyQwmE6kSWW8BdWMCueL7QsQDqnEQERERERqT4FBGfJLDLJP6jtiYbryehKKhI013Qtv7qfiaZJFAoPCG/7+zljRc5ccx0C9EomIiIhIFTXEyMfOOa777OOcmkiw68q13P3h6ozW+08HR7jj63toz+sxKJJ3Q7++p40D8UnADxjW97QtOMbX/vkoABt6568rfNJ/roHMCmXHPyi1XkREFnIUH7BSREQaJDAYm0lxaiIBwMMvDVXtuHuOjDGdzMwb4Tj/yf/v3HIlt/357tzyd79hHbsPjfLAMycB/+Y/HVRDWtUR5Uv/ZgfHzsywb3CSm69cA8BDH72BkankgnN//oNv5PiZWS5b11U0bZ2xMJ//4Bt5yyX91cmsiIiIiDS1hggMBsdna3LcoYmFx80vMbj+datz09FwC52xMB+5YVsuMMivgrS2p5Udm/vYsbmP9149d7wr1/cUPff7dmwsuvx8txERERERKUdD1EMZGo/X5LiDRY5bclyBUFC1J69EIX/A5FKNi0VERERELgSNERhM1CYwKBZwRMOhottmA4JSdf4HSjQuFhERERG5EDREVaJqlxgk0x4ZzxUNOKIlSgxygUGR0Y8BQiX2ExERERG5EDRGiUFBYHD9Zx8nkc6U2HpOMu2x9c6H+PKPDvLdp09ww+d+iOc53vHHP+by3344NypxvkhBicDFA/5ox9lehdqjcyUK+T0RFeuxSERERETkQtEQJQbvvXoD9z99Ijc/OB5naDzOltUdi+43lUgD8JUfv8q/3rGeE2OzTCbSnBiba3Tc3xljZCqRmy8MDO7/j9dzaGQ6N9/bHuXuD12DmXHN5j4Oj0xzdibJO69YU1EeRURERERqqSECgxu29/PW7f389JWR3LJyAoPpIDDwt/dv/ocn55c+bOtvXzQwWN0ZY3VB+4FdV63LTQ90qW2BiIiIiFz4KqpKZGZ/aGb7zex5M/tbM+vNW3eXmR00swNmdnPlSV2cKxizppwGyZPxvMAg6Jq0sCeirQXBRTSstgIiIiIi0ngqbWPwKHCVc+4NwMvAXQBmdgVwK3AlsAv4MzMr3p1PjZTTIHmqSInBgsCgf35gUFhiICIiIiLSCCq6y3XO/T/nXPbuejeQHXHrvcB3nHMJ59xh4CDwpkrOdS5W8CD/+NgMe1+b4OjoNOMzKdIZv6ehszNzowxPJfzGxcmMl6sutPe1iXnHWdURnTevwEBEREREGlE12xh8BLgvmN6AHyhknQiW1cyOzX3z2hh8Y/cxvrH7WG7+Q9dtJtzSwl8/cYT9/3sXrZFQripRMu3ltvvrJ47MO25rZH4gcMW67hqkXkRERESkvs4ZGJjZY8DaIqs+6Zz7+2CbTwJp4JvnmwAzuwO4A2Dz5s3nu3vOx27cTmcsxO/9YH/R9d9+6nhu1OLTEwk2r26fV5Wo0Dd+/c1cPNDBc8fP5pY99NEbFBiIiIiISEM6Z2DgnLtpsfVm9mvArwA3OpdrAnwS2JS32cZgWbHj3wvcC7Bz505XbJtyhFqMqzf1zVt22dou9g9N+ukEDD8wGJqIs3l1+7xeiQptWd3O+t42DpyazC27cn3PUpMnIiIiInJBq7RXol3AbwG3OOdm8lZ9H7jVzGJmtg3YDjxVybnK0RaZ37759Wu6ctMOcPhxx+C43wPRVLx0YNAZ82Om1rB/zO7WhujZVUTkgmJmu4Le6w6a2Z21Pl8ir+qoiIjMV2lL2i8BXcCjZvasmd0N4Jx7CfgbYC/wMPBfnHPnHoq4QrGC9gDhluJdi2Z7LJrMKzEobEvQkQ0MguW97fMbIYuISGWC3uq+DLwLuAK4LejVrmbe/HuPV/2YnueIp0r/i/O8+YXh2cJ1V9jPNjA2nVy0NNvzHJ7ncvseG51hfCaVW39sdIZPP7iXTN45/+GFQX7y8nBuPuM5Tp6dJZH20zyVSHP8zAz3/ORVvvLjV0ue2znHZHzuXKnMXJB1eGSawyPTuffCOZd7TSXSnJ6I85OXhzk6Oo1zjvGZFPuHJtg/NEE8leH0RJyJ4NiJdIbhyQR/9U+HeeHEOE+8OsI3nzzK0dFpHnlpiG/sPornOQbHZ5mMp3L7AZyejPN/Hn8lXPhMuAAADIFJREFU9/5MJdLMJOe/n845Tk/G2T80wcMvDjI4Pks64+U6KZlNZth9aBSY3wZxqU5Pxnnm2BhPHx0DYDaZYXw2xdmZ5ILPwMHTU/OuXTa9hTKeW7BdOU6enV2010bnHMm0x9h0ct41zLdYNezz5dzc5zmV8XKfyaxk2sutOzA0yT++PEw8lWE2WfNbyqKSaS/3eUoFn5d4KsN0Is1o0InNT18Z5sTYDJ7nePb42QXf/9lkhp8fOcN0Is3QeJzpRJpk2uPMdJJXTk1ydHR6wXmXU0WPwZ1zlyyy7jPAZyo5/vkq8t3Jyf8S7Tk6xsV7T/HKqanc+q7WCPHU3EBm0bAfEHjBQfvaIzVIsYhIU3sTcNA5dwjAzL6D36vd3lqedOudD9Xy8BeEr/7s8JL3/dzDxdvqXUg+9XcvLrr+jx99eZlSIlJ92U5y6qGh+t7Mdi160+UXAfD2SweKNhZ+dO8p/sPX9/Czg3O9GF2aV+0o30BnKwC3XF3TTpVERJrRBuB43nzRHuzM7A4z22Nme4aHhwtXi4g0lCdeHTn3RjXSUBXnB7piPPM/30lPW4QzM0n6O2PcfOVakhmPwbN+0dlFXTFOnp3N7bOxr41TEwk29LUBfrFWfsHD5tXtPP2pmxaMZyAiIsujGp1UHPj0Lv77/c/zs4MjnJlOsmV1O7NJv0pCazREi4Hn/KoCnnMMdMXoioXxHKQ9vwpNWyTEtVv6ODQ8TdrzmIyn2byqnfHZFNFwC6NTSbrbwrRGQqQzjuNjM/S2Rwi1tHB2JklrOERve4RUxmMiniYSaqEjGuL0ZII13TF62iIcOzNDV2uEvvYIw5MJOlvDjE4laTHDc37Jd3sszPhMktlUhmi4hbXdrYzNpJiMp+iIhnHAtv4OpuJpphJpPOdyTx8TaY+zM0kuuaiTRMojmfGIhIyOWJiTY7O0x8K0RVo4M51kXU8bvzg6xoa+Nrb1d/Dq8BTJtMea7tYgnWHGZ1NkPGiPhljTHSOVcSTSHgbMpjK0mP+/+eDpaZLpDANdMUamkkRCxuqOGOGQcXoyQTrjsWlVO0dHZ4iEjM5YmGTaY11vG+OzKVZ3RBmZSuDwqwkbRldrmFeHp7hqQ0+uWsZF3a10tYbZNzhBV2uEyXiK/s4Yg+NxLuqKBWny8zsZT9EeDZHKOMwgFAyItKojyqqOKCfPzjI8mWBjXxtHRme4dE0XR89M090aYSqRJhZuYSaZwfMckXALlwx08sLJcaLhFtIZv7qSf7wY8VSGrf3tHBmZoTUS4uL+Dl4bn8U5GJlKkEh7bFndTns0zMRsitZIC4dHpulpi9DV6n9m4qkME/E0rxvowHMwnPe+ec7x8qkpetsj9LRFSKU9IuEWzs6kCLX479XR0Rku6orhOehuC5PK+J/h3rYIqzqiDI3HeW08zpruGO1R/3N8eiJOT1uEoYk4zsGGvjZmEmnaY2HiqQx97VEm4imSaY/RqSSbVrURT3lMJ9Ok0h7bBvzP4amJBFv7OxifSeI5vxOY3vYIU/E0bdEQl1zUyfBkgrMzKTznSGccsXALk4k0V2/qZWg8TiRsDJ7109PbHmF8Nk24xRiaiNPfGaUzFiYSasFzDudgfDbFZDzN5eu7mYqnGJtJEQn5n53s+zmbyrBldQcjUwn6O2PMJNPEUx7JtMeqjmhujKyZZIZNfW0cH5vlzHSSNd0xOmNhJuJpulvDDI3H6WqN0B4NceLsLBZ817Lv5UBnjIl4itlUhrHpJO3RMGnPEQk+/5et7SLjOSbjaT58/Rbetn2gkp/MijRUYADQF9zA93fGAGiNhGiNhOheG1mwTda52g+sDo4lIiJVVXYPdpWKhUN88bYdtTi0iEjDaKiqRCIisqL8HNhuZtvMLArcit+rnYiI1EHDlRiIiMjK4JxLm9lvAo8AIeAvg17tRESkDhQYiIhI3TjnfgD8oN7pEBERVSUSEREREREUGIiIiIiICAoMREREREQEBQYiIiIiIoICAxERERERQYGBiIiIiIigwEBERERERABzztU7DTlmNgwcXeLu/cBIFZOz0jRz/ps579Dc+W+mvG9xzg3UOxH1pv8T56XZ8gvNl2flt7Gdb34r/j9xQQUGlTCzPc65nfVOR700c/6bOe/Q3Plv5rzL+Wu2z0uz5ReaL8/Kb2OrR35VlUhERERERBQYiIiIiIhIYwUG99Y7AXXWzPlv5rxDc+e/mfMu56/ZPi/Nll9ovjwrv41t2fPbMG0MRERERERk6RqpxEBERERERJaoIQIDM9tlZgfM7KCZ3Vnv9FSbmf2lmZ02sxfzlq0ys0fN7JXgb1+w3Mzsi8F78byZXVO/lFfOzDaZ2Y/MbK+ZvWRmHwuWN0v+W83sKTN7Lsj/7wbLt5nZk0E+7zOzaLA8FswfDNZvrWf6q8HMQmb2jJk9GMw3Td6lelbS/4lq/u6Z2e3B9q+Y2e15y681sxeCfb5oZrbYOZYp3xV/183srmD5ATO7OW950etf6hzLlN9eM/uume03s31mdn0jX2Mz+0TweX7RzL5t/v+3hrrGVqX7tWpd08XOUZJzbkW/gBDwKnAxEAWeA66od7qqnMe3AdcAL+Yt+wPgzmD6TuBzwfS7gX8ADLgOeLLe6a8w7+uAa4LpLuBl4Iomyr8BncF0BHgyyNffALcGy+8GfiOY/s/A3cH0rcB99c5DFd6D/wp8C3gwmG+avOtVnddK+z9Rrd89YBVwKPjbF0z3BeueCra1YN93BcuLnmOZ8l3Rdz14j54DYsC24JqHFrv+pc6xTPn9GvDvg+ko0Nuo1xjYABwG2vLe919rtGtMFe7XqnlNS51j0Tws1xeghhfheuCRvPm7gLvqna4a5HNrwQftALAumF4HHAim7wFuK7ZdI7yAvwfe2Yz5B9qBXwBvxh/wJBwsz30HgEeA64PpcLCd1TvtFeR5I/A48A7gweDHrSnyrldVP0cr+v/EUn/3gNuAe/KW3xMsWwfsz1ue267UOZYhjxV/1wuva3a7Utd/sXMsQ3578G+UrWB5Q15j/MDgOP7Nbji4xjc34jWmwvu1al7TUudYLP2NUJUo+2HLOhEsa3RrnHODwfQQsCaYbtj3IyhK3IH/1Lxp8m9+8fqzwGngUfynImedc+lgk/w85vIfrB8HVi9viqvqC8BvAV4wv5rmybtUz4r9Xajwd2+x5SeKLGeRc9RaNb7r5/s+LHaOWtsGDAN/ZX71qa+aWQcNeo2dcyeBPwKOAYP41+xpGvsaZ9Xzmp73b18jBAZNz/lhoKt3OmrJzDqB7wEfd85N5K9r9Pw75zLOuavxn6i9CbiszklaFmb2K8Bp59zT9U6LSD3U+3dvuX5bm/S7HsavcvIV59wOYBq/CkhOg13jPuC9+AHReqAD2FXr815oVsI1bYTA4CSwKW9+Y7Cs0Z0ys3UAwd/TwfKGez/MLIL/z/GbzrkHgsVNk/8s59xZ4Ef4RaG9ZhYOVuXnMZf/YH0PMLrMSa2WtwC3mNkR4Dv4VQz+lObIu1TXivtdqNLv3mLLNxZZvtg5aqla3/XzfR9GFzlHrZ0ATjjnngzmv4sfKDTqNb4JOOycG3bOpYAH8K97I1/jrHpe0/P+7WuEwODnwPag1XkUv5HK9+ucpuXwfeD2YPp2/Dqo2eW/GrREvw4YzyteWnGCFvd/Aexzzv1J3qpmyf+AmfUG02349Yz34QcIHwg2K8x/9n35APDD4OnBiuOcu8s5t9E5txX/e/1D59y/pQnyLlW3ov5PVPF37xHgl82sL3hi+8v49asHgQkzuy44169S/HuUf46aqeJ3/fvAreb3aLMN2I7fWLPo9Q/2KXWOmnLODQHHzezSYNGNwF4a9BrjVyG6zszag/Rk89uw1zhPPa/p+d8T1bIBxnK98Ftdv4xf9/qT9U5PDfL3bfw6eSn8pwy/jl9v7nHgFeAxYFWwrQFfDt6LF4Cd9U5/hXm/Ab9I7Hng2eD17ibK/xuAZ4L8vwj8drD8Yvwfw4PA/UAsWN4azB8M1l9c7zxU6X34JeZ6KmmqvOtVnddK+j9Rzd894CPBd+Ig8O/ylu8MflNeBb7E3ICnRc+xjHmv6LsOfDLI0wGCHlsWu/6lzrFMeb0a2BNc57/D74GmYa8x8LvA/iBN/xe/Z6GGusZU6X6tWtd0sXOUemnkYxERERERaYiqRCIiIiIiUiEFBiIiIiIiosBAREREREQUGIiIiIiICAoMREREREQEBQYiIiIiIoICAxERERERQYGBiIiIiIgA/x/64vsyQkORogAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1440x360 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "start=timer()\n",
    "\n",
    "env_id = \"PongNoFrameskip-v4\"\n",
    "env    = make_atari(env_id)\n",
    "env    = wrap_deepmind(env, frame_stack=False)\n",
    "env    = wrap_pytorch(env)\n",
    "model = Model(env=env, config=config)\n",
    "\n",
    "episode_reward = 0\n",
    "\n",
    "observation = env.reset()\n",
    "for frame_idx in range(1, config.MAX_FRAMES + 1):\n",
    "    epsilon = config.epsilon_by_frame(frame_idx)\n",
    "\n",
    "    action = model.get_action(observation, epsilon)\n",
    "    prev_observation=observation\n",
    "    observation, reward, done, _ = env.step(action)\n",
    "    observation = None if done else observation\n",
    "\n",
    "    model.update(prev_observation, action, reward, observation, frame_idx)\n",
    "    episode_reward += reward\n",
    "\n",
    "    if done:\n",
    "        model.finish_nstep()\n",
    "        model.reset_hx()\n",
    "        observation = env.reset()\n",
    "        model.save_reward(episode_reward)\n",
    "        episode_reward = 0\n",
    "        \n",
    "        if np.mean(model.rewards[-10:]) > 19:\n",
    "            plot(frame_idx, model.rewards, model.losses, model.sigma_parameter_mag, timedelta(seconds=int(timer()-start)))\n",
    "            break\n",
    "\n",
    "    if frame_idx % 10000 == 0:\n",
    "        plot(frame_idx, model.rewards, model.losses, model.sigma_parameter_mag, timedelta(seconds=int(timer()-start)))\n",
    "\n",
    "model.save_w()\n",
    "env.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
